如何编写 Greasemonkey 脚本
在本文中,记录了我入门 Greasemonkey 脚本编写的过程。
Greasemonkey 本质是向网页注入 JavaScript 代码。
Get hands dirty
最快速的入门方式就是直奔目标,寻找一个好玩的脚本分析之:文本选中复制,直奔代码。
元数据
脚本的开头是遗传固定写法。称为元数据。具体可参见《元数据 - 开发教程 - GM 开发手册》。几个有趣字段的含义:
@match
:匹配网址,规则 Match Patterns。@run-at
:运行时机- @connect:可以连接到哪些域名进行跨域请求
@grant
:权限@require
:外部依赖
代码入口
代码入口也是固定写法:
(function () {
// 逻辑
})();
实现逻辑
规则
该脚本适配了众多网站,用统一的 Object 结构表示适配规则,每个网站为一个 Object。
有一个数组 websites 汇聚所有规则:
const websites = [
website$s,
//……
website$3,
website$2,
website$1,
website
];
鼠标事件监听
要破除限制,需要注册触发事件:
(function() {
// 初始化
const websiteConfig = initWebsite();
initBaseEvent(websiteConfig);
initBaseStyle();
// 注册鼠标事件
window.addEventListener(
MOUSE_UP,
(e) => {
// 1. 获取用户选中的文本
// 2. 如果文本为空,隐藏某些界面元素
// 3. 如果文本不为空,那么调复制方法
const handler = () => {
const content = getSelectedText();
if (isEmptyContent(content)) {
instance.hide();
return "";
}
instance.onCopy(content, e);
};
websiteConfig.delay
? setTimeout(handler, websiteConfig.delay)
: handler();
},
// 事件的捕获或冒泡阶段是否触发事件处理函数
websiteConfig.captureInstance
);
})();
主要功能是监听鼠标的 "mouseup" 事件,当用户选中某些文本并释放鼠标按钮时,获取选中的文本并执行一些操作。
getSelectedText
该方法作用为获取选中文本。
该脚本对多种网站均做了专门适配。这说明,这些网站在文本选择上也实施了众多限制,需要专门适配。对应于众多网站适配对象的 getSelectedText 方法。
getSelectedText 方法也提供了兜底策略,如果网站没有声明专门适配,则走兜底策略:
const getSelectedText = () => {
if (siteGetSelectedText)
return siteGetSelectedText();
if (window.getSelection)
return (window.getSelection() || "").toString();
if (document.getSelection)
return (document.getSelection() || "").toString();
if (document.selection)
return document.selection.createRange().text;
return "";
};
可见,是对 DOM API 的正常请求。
instance 单例
在脚本中,声明了一个 instance 单例,并且 hide、onCopy 都是访问它进行的。
该对象在 init 方法中,创建了一个新的 div 元素,文本为(复制),可见是一个复制按钮。
通过 show、hide 方法,实现该按钮的展示与隐藏。show 方法关联点击事件,实现基于点击位置相对位置弹出。对应的页面元素为 dom2
。
onCopy
: 这个方法显示 dom
元素,并为其添加一个 click
事件监听器。当 dom
元素被点击时,复制 content
参数的内容,并隐藏 dom
元素。
对于 copy 方法,也是访问 DOM API 来实现的。
对 Greasemonkey API 的使用
前面大多都是访问的 DOM API,对页面元素进行操纵。
本节中寻找专门用到 Greasemonkey API 的场景。
GM_xmlhttpRequest
:
- 在一个网站的适配规则中,看到通过该方法请求了一个远程 JavaScript 脚本
- 并对脚本结果进行处理、使用
unsafeWindow
:
unsafeWindow
是一个特殊的全局对象,它提供了对网页的原始window
对象的访问,允许脚本修改网页的 JavaScript 环境。- 看起来是直接修改了网页的 JavaScript 内容
小结
通过简单浏览,大体了解 Greasemonkey 脚本的整体思路了。
API
Greasemonkey 精髓在于提供了一组强大的 API。具体可通过下面文档查阅:
- Greasemonkey Manual:API:官方手册 API 列表
- 《关于用户脚本 - 帮助 - GM 开发手册 (jixunmoe.github.io)》:一本开源的在线电子书。
网络资源
《Tutorials - GreaseSpot Wiki》是一个资源聚合贴,提供许多资源:
- Greasemonkey Manual - GreaseSpot Wiki:官方手册
- Greasemonkey Hacks [Book] (oreilly.com):书籍
- Code Bazaar: Monkey see, GreaseMonkey do!:视频教程
该手册分为两部分,用户指南和开发者指南。后者是我感兴趣的部分。
- Greasemonkey Manual:Editing - GreaseSpot Wiki
- 内置了一个编辑器
- Greasemonkey Manual:Environment - GreaseSpot Wiki
- Greasemonkey 在沙盒中运行,基于 Firefox 的 XPCNativeWrappers 功能,与内容网页相隔离
脚本托管站
本文作者:Maeiee
本文链接:如何编写 Greasemonkey 脚本
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!